//
//  ViewController.m
//  GCD 练习
//
//  Created by dllo on 16/8/18.
//  Copyright © 2016年 yh. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 只有一个主线程的程序成为单线程程序 单线程程序中主线程负责执行程序的所有代码(UI展示 刷新 网络请求本地存储) 这些代码只能顺序执行 不能并发执行
    // 在实际编程中 为了程序的高效运行 我们会创建多个子线程供程序运行使用 这些子线程和主线程都是彼此独立的单元 互不影响 因此能够并发执行
    
    // 之前介绍了NSThread来创建多线程 今天来介绍一下GCD(grand central dispatch)实现多线程开发 GCD是Apple开发的一种多核编程技术
    // GCD的核心是 队列 系统自动为我们创建线程并调度线程 队列分为 串行 并发
    // 线程分为同步线程 异步线程
    // 队列的创建: 串行队列 并发队列 主队列 全局队列(其中串行队列 并发队列是我们自定义的队列)
    // 下面 我们将线程分为同步和异步两个部分来考虑
    
    // 同步线程(对四种不同的队列进行分析)
    // 创建4个队列(串行队列 并发队列 主队列 全局队列)
    
    // 创建串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
    // 创建并发队列
    dispatch_queue_t conCurrentQueue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
    // 创建主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 创建全局队列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    
//    [self syncSerialQueue:serialQueue];
//    [self syncConCurrent:conCurrentQueue];
//    [self syncMainQueue:mainQueue];
//    [self syncGlobalQueue:globalQueue];
    
    // 异步线程(对四种不同的队列进行分析)
//    [self asyncSerialQueue: serialQueue];
//    [self asyncConCurrentQueue:conCurrentQueue];
//    [self asyncMainQueue:mainQueue];
//    [self asyncGlobalQueue:globalQueue];
    
    // 总结 同步线程 无论是那种队列 都不会创建新的线程 都是在主线程中 注意相同线程不能同步相同线程 在iOS9.0会导致停止执行之后的程序 在iOS10.0会导致程序crush
    // 串行: 一个任务执行完毕 再执行下一个任务
    
    
#if 0
    // 组 组只有异步并开辟多个线程 (同时开辟多个线程 同时执行任务)
    // 组的创建
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("groupQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(group, queue, ^{
        NSLog(@"group1-----%@", [NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"group2-----%@", [NSThread currentThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"group3-----%@", [NSThread currentThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"group4-----%@", [NSThread currentThread]);
    });
#endif
    
}
//----------------------------- 同步 ----------------------------
- (void)syncSerialQueue:(dispatch_queue_t)queue {
    NSLog(@"同步串行队列");
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
}

- (void)syncConCurrent:(dispatch_queue_t)queue {
    NSLog(@"同步并发队列");
    for (int i = 0; i < 5 ; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d----- %@", i, [NSThread currentThread]);
        });
    }
}

- (void)syncMainQueue:(dispatch_queue_t)queue {
    NSLog(@"主队列");
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d----- %@", i, [NSThread currentThread]);
        });
    }
}

- (void)syncGlobalQueue:(dispatch_queue_t)queue {
    NSLog(@"同步全局队列");
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
}

// ----------------------------- 异步 -----------------------
- (void)asyncSerialQueue:(dispatch_queue_t)queue {
    NSLog(@"异步并发队列");
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 1, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 2, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 3, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 4, [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"%d-----%@", 5, [NSThread currentThread]);
    });
}
- (void)asyncConCurrentQueue:(dispatch_queue_t)queue {
    NSLog(@"异步并发队列");
//        dispatch_async(queue, ^{
//            NSLog(@"%d-----%@", 1, [NSThread currentThread]);
//        });
//    dispatch_async(queue, ^{
//        NSLog(@"%d-----%@", 2, [NSThread currentThread]);
//    });
//    dispatch_async(queue, ^{
//        NSLog(@"%d-----%@", 3, [NSThread currentThread]);
//    });
//    dispatch_async(queue, ^{
//        NSLog(@"%d-----%@", 4, [NSThread currentThread]);
//    });
//    dispatch_async(queue, ^{
//        NSLog(@"%d-----%@", 5, [NSThread currentThread]);
//    });
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }

    
}

- (void)asyncMainQueue:(dispatch_queue_t)queue {
    NSLog(@"异步主队列");
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
}

- (void)asyncGlobalQueue:(dispatch_queue_t)queue {
    NSLog(@"异步全局队列");
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d-----%@", i, [NSThread currentThread]);
        });
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
